Графические интерфейсы пользователя Java - Тимур Сергеевич Машнин
Размещение дочерних компонентов с использованием компоновки FormLayout осуществляется выполнением следующих шагов:
С помощью конструктора создается экземпляр класса FormData.
Класс FormData имеет поля bottom, left, right, top, определяющие прикрепление четырех сторон компонента, а также поля height и width, определяющие предпочтительные размеры компонента.
Определяются значения полей экземпляра класса FormData путем присваивания экземпляров класса FormAttachment.
Экземпляр класса FormAttachment может быть создан с помощью одного из конструкторов.
Экземпляр класса FormData связывается с компонентом с помощью метода setLayoutData суперкласса Control.
Компоновка RowLayout размещает компоненты в строку или столбец и имеет регулировки отступов, выравнивания и типа (горизонтальный или вертикальный).
В отличие от компоновки FillLayout для компоновки RowLayout можно установить перенос на следующую строку или столбец, а размеры компонента могут быть определены путем вызова метода setLayoutData суперкласса Control с аргументом – объектом RowData.
Экземпляр класса RowData создается с помощью конструктора.
Компоновка StackLayout собирает компоненты в стек по оси Z, подгоняя их к одному размеру, и имеет регулировки отступов.
При этом поле topControl определяет, какой компонент находится на вершине стека.
Компоновка FlowLayout представляет собой перенос AWT-компоновки FlowLayout в систему SWT.
Компоновка FlowLayout располагает компоненты аналогично строкам текста в параграфе и имеет регулировки выравнивания и отступов.
Компоновка BoxLayout представляет собой перенос Swing-компоновки BoxLayout в систему SWT.
Компоновка BoxLayout располагает компоненты по оси X или по оси Y в одну строку или столбец без возможности переноса.
Компоновка BorderLayout представляет собой перенос AWT-компоновки BorderLayout в систему SWT.
Компоновка BorderLayout делит контейнер на пять областей – север, юг, восток, запад и центр, в которых и располагает компоненты.
Раздел Controls Palette-палитры предоставляет SWT-компоненты пакетов org.eclipse. swt. widgets, org.eclipse.swt.custom и org.eclipse.swt.browser.
Кроме того, раздел Controls Palette-палитры обеспечивает определение с помощью пакета org.eclipse. swt. dnd источника и цели операции Drag and Drop.
Если после добавления компонента контроля в область визуального редактирования щелкнуть его два раза левой кнопкой мышки, тогда для некоторых компонентов будет сгенерирован код присоединения слушателя событий выбора компонента.
В вершине иерархии SWT-классов компонентов находится класс Widget, обеспечивающий создание и удаление компонента, а также присоединение и удаление слушателей событий компонента.
Так как система SWT представляет собой Java-оболочку библиотеки графических компонентов низлежащей операционной системы, а многие библиотеки интерфейса требуют определения родителя при создании компонента, который, кроме того, имеет свои характеристики (styles), система SWT также определяет создание компонента с помощью конструктора класса, аргументами которого служат – объект родительского компонента и стиль создаваемого компонента, описывающий его поведение и внешний вид.
В этом состоит отличие системы SWT от систем AWT и Swing, в которых дочерние компоненты добавляются к компоненту-контейнеру с помощью метода add.
Удаление экземпляров компонентов системы SWT также имеет свою особенность.
Так как при создании экземпляра SWT-компонента создается соответствующий экземпляр компонента операционной системы, а сборщик мусора JVM не имеет четкого расписания времени, для корректного управления ресурсами необходимо программным способом удалять экземпляры SWT-компонентов, используя метод dispose.
Для обработки событий компонентов система SWT предлагает два типа слушателей – типизированные и не типизированные слушатели.
Не типизированные слушатели присоединяются к SWT-компоненту методом addListener класса Widget, где параметр eventType – код типа события, определяемый полем класса SWT, а параметр listener – экземпляр класса (как правило, анонимного), реализующего интерфейс Listener с единственным методом handleEvent.
Типизированные слушатели присоединяются к SWT-компоненту методами addХХХListener, где параметр listener – экземпляр класса (как правило, анонимного), реализующего интерфейс ХХХListener с методами обработки конкретного типа событий.
Раздел JFace Palette-палитры обеспечивает использование JFace-компонентов пакетов org.eclipse.jface.viewers, org.eclipse. jface. text и org.eclipse.jface.fieldassist.
JFace-компоненты ComboViewer, ListViewer, TableViewer, TableViewerColumn, CheckboxTableViewer, TreeViewer, TreeViewerColumn, CheckboxTreeViewer и TextViewer представляют собой обертки соответствующих SWT-компонентов, реализуя архитектуру MVC.
При добавлении JFace-компонентов в область визуального редактирования WindowBuilder-редактора отображается SWT-компонент и значок JFace-компонента.
Реализация архитектуры MVC JFace-компонентами заключается в том, что данные и метки компонента определяются отдельно с помощью объектов IContentProvider и IBaseLabelProvider, которые устанавливаются для JFace-компонента методами setContentProvider и setLabelProvider соответственно.
Расширения интерфейса IContentProvider обеспечивают возврат данных для JFace-компонентов. Для дерева – это интерфейс ITreeContentProvider, для списка и таблицы – это интерфейс IStructuredContentProvider.
Расширения интерфейса IBaseLabelProvider обеспечивают возврат меток для элементов JFace-компонентов. Для дерева и списка – это интерфейс ILabelProvider, для таблицы – это интерфейс ITableLabelProvider.
После создания поставщика данных и присоединения его к JFace-компоненту необходимо вызвать метод setInput для загрузки данных.
Кроме того, для вышеуказанных JFace-компонентов с помощью метода setSorter можно определить сортировку, которая обеспечивается объектом ViewerSorter, а с помощью метода setFilters определить фильтрацию, обеспечиваемую объектами ViewerFilter.
JFace-компонент TextViewer также представляет собой обертку SWT-компонента StyledText, реализующую архитектуру MVC.
Реализация архитектуры MVC компонентом TextViewer заключается в том, что документ, т.е. данные для редактирования определяются отдельно с помощью объекта Document, который связывается с TextViewer-компонентом методом setDocument.
Библиотеки org.eclipse. jface. text.* системы JFace позволяют создать на основе компонента TextViewer полнофункциональный редактор, обеспечивающий подсветку текста, форматирование, автодополнение текста, отмену изменений, поиск и замену и так далее.
Раздел Forms API Palette-палитры обеспечивает использование пакета org.eclipse.ui.forms. widgets.
Eclipse-формы представляют способ организации SWT/JFace компонентов таким образом, что конечный интерфейс имеет сходство с Web-страницей.
Такой эффект достигается без использования встроенного Web-браузера за счет применения специального класса FormToolkit для адаптации компонентов к работе в форме, компоновки TableWrapLayout, работающей аналогично HTML-таблице, набора специальных контейнеров и компонентов пакетов org.eclipse.ui.forms. widgets и org.eclipse.ui.forms, а также многостраничного редактора FormEditor.
Раздел Menu Palette-палитры обеспечивает использование различного рода меню пакета org.eclipse. swt. widgets.
И наконец элемент SWT_AWT Composite раздела SWT_AWT Palette-палитры при перетаскивании в область визуального редактирования инициирует генерацию следующего кода.
В данном коде создается SWT-контейнер Composite, с которым связывается AWT-окно Frame с помощью метода new_Frame класса SWT_AWT, служащего мостом между системами SWT и AWT.
Далее окно Frame подготавливается для присоединения AWT и Swing компонентов путем определения для него корневой панели и компоновки.
Элемент Choose Swing Component раздела SWT_AWT Palette-палитры открывает палитру AWT и Swing компонентов для добавления их в окно Frame.
Связывание данных
Платформа Eclipse предоставляет программный интерфейс связывания данных, представленный библиотеками org.eclipse.core. databinding.* и org.eclipse. jface. databinding.*, которые обеспечивают связывание свойств Widget-компонентов и объектов данных.
Связывание данных (Data Binding) представляет собой синхронизацию двух источников данных таким образом, что изменение данных одного объекта автоматически отражается в другом объекте.
Сам механизм связывания основан на Observer-шаблоне программирования, в котором связываемый объект имеет список своих зависимостей, или объектов-наблюдателей, и уведомляет их автоматически об изменениях своего состояния, вызывая соответствующие методы объектов-наблюдателей.
WindowBuilder-плагин обеспечивает связывание данных с помощью мастера JFace Automating Databinding раздела WindowBuilder | SWT Designer | Databinding команды New, команды Bindings контекстного меню визуальной области редактирования и окна Structure, а также с помощью вкладки Bindings WindowBuilder-редактора, которая имеет функциональность, аналогичную функциональности команды Bindings контекстного меню.
Для